"""
投资决策页面渲染模块。
"""
import streamlit as st
import pandas as pd
import plotly.express as px

# 从 app_setup 导入 logger (如果需要)
try:
    from .app_setup import logger
except ImportError:
    import logging
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger(__name__)

# 尝试导入配置，如果失败则使用默认值
try:
    from config.settings import DEFAULT_ASSET_ALLOCATION, SECTOR_ALLOCATION, SECTOR_NAME_MAP
except ImportError:
    logger.warning("无法从 config.settings 导入配置，将使用默认值。")
    DEFAULT_ASSET_ALLOCATION = {"股票": 0.6, "债券": 0.3, "现金": 0.1}
    SECTOR_ALLOCATION = {"Technology": 0.25, "Consumer": 0.20, "Healthcare": 0.15, "Financials": 0.15, "Industrials": 0.10, "Others": 0.15}
    SECTOR_NAME_MAP = {"Technology": "科技", "Consumer": "消费", "Healthcare": "医疗", "Financials": "金融", "Industrials": "工业", "Others": "其他"}


# 示例交易数据 (保持不变，用于展示格式)
DEFAULT_TRADES = [
    {"操作": "买入", "股票代码": "600036", "股票名称": "招商银行", "价格": 42.15, "数量": 5000, "理由": "银行板块估值处于历史底部，ROE保持稳定，股息率较高"},
    {"操作": "买入", "股票代码": "300750", "股票名称": "宁德时代", "价格": 215.86, "数量": 800, "理由": "新能源产业链龙头，业绩增长确定性高，技术优势明显"},
    {"操作": "买入", "股票代码": "000858", "股票名称": "五粮液", "价格": 168.30, "数量": 1000, "理由": "消费板块估值合理，公司基本面稳健，现金流充沛"},
    {"操作": "卖出", "股票代码": "601318", "股票名称": "中国平安", "价格": 48.25, "数量": 3000, "理由": "保险板块业绩承压，估值修复空间有限，资金转向其他方向"},
    {"操作": "卖出", "股票代码": "000001", "股票名称": "平安银行", "价格": 12.85, "数量": 10000, "理由": "银行板块内部结构性调整，龙头更具配置价值，减持二线银行"}
]

def render_investment_decisions():
    """渲染投资决策界面"""
    st.markdown('<div class="main-header">投资决策</div>', unsafe_allow_html=True)

    # --- 市场观点 ---
    render_market_outlook()

    # --- 投资策略 ---
    render_investment_strategy()

    # --- 风险管理 ---
    render_risk_management()

    # --- 具体交易决策 ---
    render_trade_decisions()

    # --- 跟踪盯市指标 ---
    render_tracking_indicators()


def render_market_outlook():
    """渲染市场观点部分"""
    st.markdown('<div class="sub-header">市场观点</div>', unsafe_allow_html=True)
    # 尝试从 workflow_result 获取市场分析
    market_analysis = "市场处于震荡上行阶段，科技和医疗板块有望表现良好" # 默认观点
    if st.session_state.get('workflow_result') and "result" in st.session_state.workflow_result:
        result = st.session_state.workflow_result.get("result", {}) # 使用 .get() 避免 KeyError
        if isinstance(result, dict) and "market_analysis" in result:
            # 检查 market_analysis 是否非空且为字符串
            analysis_text = result.get("market_analysis")
            if isinstance(analysis_text, str) and analysis_text.strip():
                market_analysis = analysis_text
                logger.info("使用来自 workflow_result 的市场观点。")
            else:
                logger.info("workflow_result 中的 market_analysis 无效或为空，使用默认市场观点。")
        else:
            logger.info("workflow_result 中无有效的 market_analysis，使用默认市场观点。")
    else:
        logger.info("无 workflow_result，使用默认市场观点。")


    st.markdown(f"""
    <div class="highlight">
    {market_analysis}
    <br><br>
    <i>基于对宏观经济数据、市场技术指标和资金面的综合分析。</i>
    </div>
    """, unsafe_allow_html=True)


def render_investment_strategy():
    """渲染投资策略部分 (资产配置和行业配置)"""
    st.markdown('<div class="sub-header">投资策略</div>', unsafe_allow_html=True)
    col1, col2 = st.columns(2)

    # --- 资产配置 ---
    with col1:
        st.markdown("#### 资产配置")
        asset_allocation = DEFAULT_ASSET_ALLOCATION.copy() # Start with default
        # 尝试从 workflow_result 获取资产配置
        if st.session_state.get('workflow_result') and "result" in st.session_state.workflow_result:
            result = st.session_state.workflow_result.get("result", {})
            if isinstance(result, dict) and "portfolio_allocation" in result and isinstance(result["portfolio_allocation"], dict):
                 # 确保值的类型正确且总和约为1 (或100)
                wf_alloc = result["portfolio_allocation"]
                # 过滤掉非数值类型的值
                valid_alloc = {k: v for k, v in wf_alloc.items() if isinstance(v, (int, float))}
                if valid_alloc and sum(valid_alloc.values()) > 0:
                    # 如果值是比例 (0-1)，直接使用；如果是百分比，转换为比例
                    total = sum(valid_alloc.values())
                    if total > 1.1: # 假设大于1.1意味着是百分比
                         asset_allocation = {k: v / total for k, v in valid_alloc.items()}
                    else:
                         asset_allocation = valid_alloc
                    logger.info("使用来自 workflow_result 的资产配置。")
                else:
                    logger.warning("workflow_result 中的 portfolio_allocation 格式无效或总和为零，使用默认配置。")
            else:
                logger.info("workflow_result 中无有效的 portfolio_allocation，使用默认配置。")
        else:
            logger.info("无 workflow_result，使用默认资产配置。")


        try:
            # 确保 asset_allocation 非空
            if asset_allocation:
                fig = px.pie(
                    names=list(asset_allocation.keys()),
                    values=list(asset_allocation.values()),
                    title="建议资产配置比例",
                    color_discrete_sequence=px.colors.sequential.Blues_r,
                    hole=0.3
                )
                fig.update_traces(textposition='inside', textinfo='percent+label')
                fig.update_layout(height=300, margin=dict(t=40, l=10, r=10, b=10))
                st.plotly_chart(fig, use_container_width=True)
            else:
                st.info("无有效的资产配置数据。")
        except Exception as e:
            logger.error(f"渲染资产配置饼图时出错: {e}", exc_info=True)
            st.warning("无法渲染资产配置图。")

    # --- 行业配置 ---
    with col2:
        st.markdown("#### 行业配置")
        # 使用从配置或默认值加载的 SECTOR_ALLOCATION 和 SECTOR_NAME_MAP
        sector_allocation_display = {}
        try:
            # 确保 SECTOR_ALLOCATION 和 SECTOR_NAME_MAP 已定义
            if 'SECTOR_ALLOCATION' in locals() and 'SECTOR_NAME_MAP' in locals():
                for sector_en, weight in SECTOR_ALLOCATION.items():
                    sector_zh = SECTOR_NAME_MAP.get(sector_en, sector_en)
                    sector_allocation_display[sector_zh] = weight
            else:
                 raise NameError("SECTOR_ALLOCATION 或 SECTOR_NAME_MAP 未定义")
        except NameError: # 如果导入失败或变量未定义
             logger.warning("SECTOR_ALLOCATION 或 SECTOR_NAME_MAP 未定义，使用模拟数据。")
             sector_allocation_display = {"科技": 0.25, "消费": 0.20, "医疗": 0.15, "金融": 0.15, "工业": 0.10, "其他": 0.15}


        try:
            # 确保 sector_allocation_display 非空
            if sector_allocation_display:
                fig = px.bar(
                    x=list(sector_allocation_display.keys()),
                    y=list(sector_allocation_display.values()),
                    title="建议行业配置比例",
                    color=list(sector_allocation_display.values()),
                    color_continuous_scale="Viridis",
                    labels={'x': '行业', 'y': '配置比例'}
                )
                fig.update_layout(height=300, margin=dict(t=40, l=10, r=10, b=10))
                st.plotly_chart(fig, use_container_width=True)
            else:
                st.info("无有效的行业配置数据。")
        except Exception as e:
            logger.error(f"渲染行业配置条形图时出错: {e}", exc_info=True)
            st.warning("无法渲染行业配置图。")


def render_risk_management():
    """渲染风险管理部分"""
    st.markdown('<div class="sub-header">风险管理</div>', unsafe_allow_html=True)
    col1, col2, col3 = st.columns(3)
    with col1:
        st.metric(label="波动率控制", value="中等")
        st.markdown("- 组合年化波动率目标: 15%")
        st.markdown("- 对冲策略: 指数期货部分对冲")
    with col2:
        st.metric(label="止损策略", value="分级止损")
        st.markdown("- 单股止损: -10%")
        st.markdown("- 组合止损: -7%")
        st.markdown("- 板块止损: -15%")
    with col3:
        st.metric(label="分散度", value="中高")
        st.markdown("- 单股最大仓位: 8%")
        st.markdown("- 行业最大仓位: 30%")
        st.markdown("- 持股数量: 20-30只")


def render_trade_decisions():
    """渲染具体交易决策表格"""
    st.markdown('<div class="sub-header">交易决策</div>', unsafe_allow_html=True)
    trades = DEFAULT_TRADES # 默认交易

    # 尝试从 workflow_result 获取交易决策 (stock_picks)
    # 注意：workflow_result 目前只包含 stock_picks 列表，没有详细交易信息
    # 这里我们仍然使用静态的 DEFAULT_TRADES，但可以高亮显示 workflow_result 中的 picks
    picks_from_workflow = []
    if st.session_state.get('workflow_result') and "result" in st.session_state.workflow_result:
        result = st.session_state.workflow_result.get("result", {})
        if isinstance(result, dict) and "stock_picks" in result and isinstance(result["stock_picks"], list):
            # 确保 picks_from_workflow 中的代码是 6 位字符串
            picks_from_workflow = [str(pick).zfill(6) for pick in result["stock_picks"]]
            logger.info(f"从 workflow_result 获取到推荐股票: {picks_from_workflow}")
        else:
            logger.info("workflow_result 中无有效的 stock_picks。")
    else:
        logger.info("无 workflow_result，无法获取推荐股票。")


    trades_df = pd.DataFrame(trades)
    # 确保 trades_df 中的股票代码也是 6 位字符串
    if not trades_df.empty and '股票代码' in trades_df.columns:
        trades_df['股票代码'] = trades_df['股票代码'].astype(str).str.zfill(6)

    # 高亮显示 workflow 推荐的股票 (如果存在)
    def highlight_picks(row):
        # 检查 picks_from_workflow 是否非空
        if picks_from_workflow and row['股票代码'] in picks_from_workflow and row['操作'] == '买入':
            return ['background-color: #D1FAE5'] * len(row) # 浅绿色高亮
        return [''] * len(row)

    st.dataframe(
        trades_df.style.apply(highlight_picks, axis=1), # 应用高亮
        column_config={
            "操作": st.column_config.TextColumn("操作", width="small"),
            "股票代码": st.column_config.TextColumn("股票代码", width="small"),
            "股票名称": st.column_config.TextColumn("股票名称", width="small"),
            "价格": st.column_config.NumberColumn("价格(元)", format="%.2f", width="small"),
            "数量": st.column_config.NumberColumn("数量(股)", format="%d", width="small"),
            "理由": st.column_config.TextColumn("投资理由", width="large"), # 加宽理由列
        },
        hide_index=True,
        use_container_width=True
    )


def render_tracking_indicators():
    """渲染重点跟踪指标部分"""
    st.markdown('<div class="sub-header">重点跟踪指标</div>', unsafe_allow_html=True)
    col1, col2, col3 = st.columns(3)
    with col1:
        st.markdown("**宏观指标**")
        st.markdown("- PMI: 关注制造业采购经理指数")
        st.markdown("- CPI/PPI: 关注通胀走势")
        st.markdown("- 社融: 关注信贷投放节奏")
    with col2:
        st.markdown("**行业指标**")
        st.markdown("- 芯片: 关注产能利用率和订单情况")
        st.markdown("- 新能源: 关注装机量和政策支持")
        st.markdown("- 消费: 关注零售数据和假期消费")
    with col3:
        st.markdown("**市场指标**")
        st.markdown("- 北向资金: 关注外资流入流出")
        st.markdown("- 融资融券: 关注市场杠杆水平")
        st.markdown("- 成交量: 关注市场活跃度变化")